/**
  * 文件说明
  * @Description:扩展说明
  * @Copyright: 2014 www.zhixueyun.com Inc. All right reserved
  * @Version: V6.0
  */
package com.frame.component.scheduled;

import java.util.List;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**  
 * 定时器util
 * 重复执行：每隔时间段执行、每日执行、每周执行、每月执行、每年执行
 * 执行一次：一定时间段后执行、某个时间点执行
 * @Author: liping.wang
 * @Date: 2014年4月18日 上午10:45:04 
 * @ModifyUser: liping.wang
 * @ModifyDate: 2014年4月18日 上午10:45:04 
 * @Version:V6.0
 */
public class ScheduledExecutor {

//	private static Executor threadPool = Executors.newScheduledThreadPool(20);
	private static ScheduledThreadPoolExecutor threadPool = new ScheduledThreadPoolExecutor(10);
//	private static Timer timer = new Timer();
	
	/**
	 * 执行任务
	 * @param t
	 * @return ScheduledFuture<?> 
	 * @Author: liping.wang
	 * @Date: 2014年4月21日 下午4:36:20
	 * @ModifyUser：liping.wang
	 * @ModifyDate: 2014年4月21日 下午4:36:20
	 */
    public static ScheduledFuture<?> schedule(Schedule t) {
    	ScheduledFuture<?> handler = null;
    	switch (t.repeatType) {
    	case Schedule.RepeatType.Once:
			handler = oncePeriodSchedule(t);
			break;

		default:
			handler = fixedPeriodSchedule(t);
			break;
		}
    	return handler;
    }  
   
    /*
     * 执行一次
     */
    private static ScheduledFuture<?> oncePeriodSchedule(Schedule t) {
    	// 设定值执行一次的runnable  
    	ScheduledFuture<?> handler = threadPool.schedule(t, t.delay, TimeUnit.MILLISECONDS);  
    	return handler;
    }
    /*
     * 重复执行
     */
    private static ScheduledFuture<?> fixedPeriodSchedule(Schedule t) {  
        // 设定可以循环执行的runnable,任务的间隔为1秒  
    	ScheduledFuture<?> handler = threadPool.scheduleAtFixedRate(t, t.delay, t.period, TimeUnit.MILLISECONDS);  
    	return handler;
    }


	public static List<Runnable> shutdown() {
		return threadPool.shutdownNow();
	}

    /**
     * 停止任务
     * @param t
     * @return ScheduledFuture<?>
     * @Author: liping.wang
     * @Date: 2014年4月21日 下午4:36:20
     * @ModifyUser：liping.wang
     * @ModifyDate: 2014年4月21日 下午4:36:20
     */
    private static void cancel(Schedule t) {
    	threadPool.remove(t);
    }
}
